﻿#pragma once

#include <mutex>
#include <utility>

template<class T>
class ZSingleton final {
 public:
  ZSingleton() = delete;
  ~ZSingleton() = delete;

  /**
   * 生成对应类型的单例
   * @tparam Args 初始化用到的参数
   * @param args 参数包
   * @return 实例
   */
  template<typename... Args>
  static T* generate(Args&&... args) {
    if (!instance_) {
      instance_ = new T(std::forward<Args>(args)...);
    }
    return instance_;
  }

  /**
   * 获得实例
   * @return 实例,如果没初始化则是nullptr
   */
  static T* instance() {

    return instance_;
  }

  /**
   * 释放掉实例
   */
  static void release() {

    delete instance_;
    instance_ = nullptr;
  }

 private:
  // 实例
  static T* instance_;
};

// 在此处定义模板类的静态成员变量
template<typename T>
T* ZSingleton<T>::instance_ = nullptr;  // 初始化为 nullptr
